package cn.bone.netty02.client;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

/**
 * Created by superbone on 2016/9/10.
 */
public class TimeClientHandler extends ChannelHandlerAdapter{

    private int counter;
    private String reqStr = "现在几点?1、在netty中能否有自动的把接收的Bytebuf数据转String，不需要我手动处理？" +
            "        答：有，可以在管道中添加一个StringDecoder." +
            "    2、在网络传输过程中有半包粘包的问题，netty能解决吗？" +
            "        答：能，netty提供了很丰富的解码器，在正确合理的使用下就能解决半包粘包问题。" +
            "    3、常用的String字符串下有什么样的解码器呢？" +
            "        答：不仅在String下有处理半包粘包的解码器在处理其他的数据格式也有，其中谷歌的protobuf数据格式就是其中一个。对于String的有一下常用的三种：" +
            "              1、LineBasedFrameDecoder            基于换行" +
            "              2、DelimiterBasedFrameDecoder      基于指定字符串" +
            "              3、FixedLengthFrameDecoder         基于字符串长度" +
            "     4、那么3中提到例子该如何体现在代码中呢？" +
            "        答：在下面的例子中已经提供。"+System.getProperty("line.separator");

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("客户端出现异常:"+cause.getMessage());
        ctx.close();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
       /* ByteBuf buf = (ByteBuf)msg;
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);
        String reqStr = new String(bytes,"UTF-8");
        counter++;
        System.out.println("客户端收到消息:"+reqStr+"-->"+counter);*/

        String body = (String)msg;
        counter++;
        System.out.println("客户端收到消息:"+body+"-->"+counter);
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        ByteBuf buf = null;
        for(int i=0;i<100;i++){
            buf = Unpooled.copiedBuffer(reqStr.getBytes("UTF-8"));

            //byte[] bytes = reqStr.getBytes();
            //buf = Unpooled.buffer(bytes.length);
            //buf.writeBytes(bytes);
            ctx.writeAndFlush(buf);
        }

    }
}
